#include "common.h"

int main()
{
    key_t shm_key = ftok(KEY_PATH, SHM_KEY);
    key_t sem_key = ftok(KEY_PATH, SEM_KEY);

    // 创建共享内存
    int shm_id = shmget(shm_key, sizeof(SharedMemory), IPC_CREAT | 0666);
    SharedMemory *shm = (SharedMemory *)shmat(shm_id, NULL, 0);

    // 创建信号量（3个信号量：empty=1, full=0, mutex=1）
    int sem_id = semget(sem_key, 3, IPC_CREAT | 0666);
    sem_union.val = 1;
    semctl(sem_id, 0, SETVAL, sem_union); // empty=1
    sem_union.val = 0;
    semctl(sem_id, 1, SETVAL, sem_union); // full=0
    sem_union.val = 1;
    semctl(sem_id, 2, SETVAL, sem_union); // mutex=1

    char input[SHM_SIZE];
    while (1)
    {
        printf("生产者输入数据（quit退出）: ");
        fgets(input, SHM_SIZE, stdin);
        input[strcspn(input, "\n")] = '\0'; // 去除换行符

        // 等待缓冲区空（empty-1）
        sem_op(sem_id, 0, -1);
        // 互斥访问共享内存（可选，因生产者单线程可省略，但保持对称）
        sem_op(sem_id, 2, -1);

        strcpy(shm->data, input);

        // 释放互斥锁，通知消费者有数据（full+1）
        sem_op(sem_id, 2, +1);
        sem_op(sem_id, 1, +1);

        if (strcmp(input, "quit") == 0)
            break;
    }

    shmdt(shm);
    semctl(sem_id, 0, IPC_RMID);    // 删除信号量
    shmctl(shm_id, IPC_RMID, NULL); // 删除共享内存
    return 0;
}